package ThreadTest.AccountWithdrawals;
/*
测试在多线程环境下取款
synchronized关键字的初步使用
    在实例方法上可以使用synchronized吗？可以的
        synchronized出现在实例方法上，一定锁的是this，这种方法不灵活
        另外还有一个缺点：synchronized出现在实例方法上，表示整个方法体都需要同步
        可能会无故扩大同步的范围，导致程序的执行效率降低，所以这种方式不常用
synchronized三种写法：
    第一种：同步代码块，灵活
        synchronized(线程共享对象){
            同步代码块;
        }
    第二种：在实例方法上使用synchronized
        表示共享对象一定是this
        并且同步代码块是整个方法体
    第三种：在静态方法上使用synchronized
        表示找类锁，类锁永远只有1把
        就是创建了100个对象，类锁也只有一把
    对象锁：100个对象有100把锁
    类锁：100个对象也只有1把锁
 */
public class Test {
    public static void main(String[] args) {
        Account a = new Account("123","zs",4000);
        MyThread m = new MyThread(a);
        MyThread m1 = new MyThread(a);
        Thread t = new Thread(m);
        Thread t1 = new Thread(m1);
        t.start();
        t1.start();
        a.withdraw(1000);
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        a.showBalance();
    }
}
